package cn.com.colasoft.generics;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

/**
 * 泛型不消失的情况对比
 *
 * Java 引入泛型擦除的原因是避免因为引入泛型而导致运行时创建不必要的类。那我们其实就可以通过定义类的方式，在类信息中保留泛型信息，从而在运行时获得这些泛型信息。
 * <p>简而言之，Java 的泛型擦除是有范围的，即类定义中的泛型是不会被擦除的</p>
 */
public class Main {

    private static class HashMapEx<K, V> extends HashMap<K, V> {
        public HashMapEx() {
            super();
        }
    }

    public static void main(String[] args) {
        // 此处必须用匿名内部类的方式写，如果使用new HashMapEx<String,Integer> 泛型会被擦除，无法获取到父类的泛型具体信息
        Map<String, Integer> map = new HashMapEx<String, Integer>(){};

        Type type = map.getClass().getGenericSuperclass(); // 获取HashMapEx父类HashMap<K,V>
        ParameterizedType parameterizedType = ParameterizedType.class.cast(type);

        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // 两个类型  一个是K，一个是V
        for (Type typeArgument : actualTypeArguments) {
            System.out.println(typeArgument.getTypeName()); //k,v（泛型消失了）
        }
    }
}
